package com.alatus.djl.app;

import ai.djl.MalformedModelException;
import ai.djl.translate.TranslateException;
import com.alatus.djl.service.InterferenceService;
import com.alatus.djl.service.TrainService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadPoolExecutor;

@RestController
public class DeepLearning {
//    线性函数,就是一条线过去,现在我有两个点的坐标,我要知道第三个点的坐标
//
//            我只需要套用线性的数学公式,如Y=ax+b,只要能顺利得到前两个点的坐标
//
//    就能使用这个公式得到第三个点的坐标(我只需要套用一下第三个点,如果套不上,就说明他们不在一条线上)
//
//    机器学习是计算这些点的关系,如果我现在给出一堆点,我要求你计算这些点之间的关系
//
//            现在是很多很多点,如何能让他们成为一个线或者说一个集合
//
//    需要你从这些点的矩阵数据集合里找相同的规律确切的说是
//
//            因为这里的点很多很多,机器学习就需要不断的调整和计算,最终就会得到一个范围
//
//    再有新的数据进来,我就看你是不是在我的范围内即可
//            机器学习大概就是四类算法
//
//    Classification分类算法
//
//            Regression回归算法回归问题
//
//    clustering聚类问题
//
//    dimensionality reduction降维问题
//
//    机器学习算法选择
//
//    样本数是否大于50?是继续,否去收集数据去
//
//是否推理的是分类问题?是就看我们的数据是否标注完成
//
//            不是分类问题的就属于回归问题和降维问题
//
//    是分类问题,我们的数据是否有人工标注?
//
//    是就是监督学习的类型,走分类算法部分
//
//            没有就属于聚类问题,走聚类算法
    @Autowired
    private TrainService trainService;
    @Autowired
    private InterferenceService interferenceService;
    @Autowired
    private ThreadPoolTaskExecutor threadPoolExecutor;
    //训练模型的接口
    @GetMapping("/train")
    public String train() {
        try {
            trainService.train("build/ut-zap50k-images-square","build/models","footWeaver");
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (TranslateException e) {
            throw new RuntimeException(e);
        }
        return "ok";
    }
    //进行推理
    @PostMapping("/result")
    public String predict(@RequestPart("file") MultipartFile image) {
        try {
            return trainService.predict(image);
        } catch (MalformedModelException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (TranslateException e) {
            throw new RuntimeException(e);
        }
//        返回结果的分类
    }
}
